home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / UI / EnvelopeUI.fl < prev    next >
Text File  |  2005-03-14  |  26KB  |  852 lines

  1. # data file for the Fltk User Interface Designer (fluid)
  2. version 1.0106 
  3. header_name {.h} 
  4. code_name {.cc}
  5. decl {//Copyright (c) 2002-2005 Nasca Octavian Paul} {} 
  6.  
  7. decl {//License: GNU GPL version 2} {} 
  8.  
  9. decl {\#include "WidgetPDial.h"} {public
  10.  
  11. decl {\#include <stdio.h>} {public
  12.  
  13. decl {\#include <stdlib.h>} {public
  14.  
  15. decl {\#include "../globals.h"} {public
  16.  
  17. decl {\#include <FL/Fl_Group.H>} {public
  18.  
  19. decl {\#include "../Params/EnvelopeParams.h"} {public
  20.  
  21. decl {\#include <FL/Fl_Box.H>} {public
  22.  
  23. decl {\#include <FL/fl_draw.H>} {public
  24.  
  25. decl {\#include <FL/fl_ask.H>} {public
  26.  
  27. decl {\#include "PresetsUI.h"} {public
  28.  
  29. class EnvelopeFreeEdit {: {public Fl_Box}
  30. } {
  31.   Function {EnvelopeFreeEdit(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} {
  32.     code {env=NULL;
  33. pair=NULL;} {}
  34.   }
  35.   Function {init(EnvelopeParams *env_)} {} {
  36.     code {env=env_;
  37. oldx=-1;
  38. currentpoint=-1;
  39. cpx=0;
  40. lastpoint=-1;} {}
  41.   }
  42.   Function {setpair(Fl_Box *pair_)} {} {
  43.     code {pair=pair_;} {}
  44.   }
  45.   Function {getpointx(int n)} {return_type int
  46.   } {
  47.     code {int lx=w()-10;
  48. int npoints=env->Penvpoints;
  49.  
  50. float  sum=0;
  51. for (int i=1;i<npoints;i++) sum+=env->getdt(i)+1;
  52.  
  53. float sumbefore=0;//the sum of all points before the computed point
  54. for (int i=1;i<=n;i++) sumbefore+=env->getdt(i)+1;
  55.  
  56. return((int) (sumbefore/(REALTYPE) sum*lx));} {}
  57.   }
  58.   Function {getpointy(int n)} {return_type int
  59.   } {
  60.     code {int ly=h()-10;
  61.  
  62. return((int) ((1.0-env->Penvval[n]/127.0)*ly));} {}
  63.   }
  64.   Function {getnearest(int x,int y)} {return_type int
  65.   } {
  66.     code {x-=5;y-=5;
  67.  
  68. int nearestpoint=0;
  69. int nearestval=1000000;//a big value
  70. for (int i=0;i<env->Penvpoints;i++){
  71.    int distance=abs(x-getpointx(i))+abs(y-getpointy(i));
  72.    if (distance<nearestval) {
  73.      nearestpoint=i;
  74.      nearestval=distance;  
  75.    };
  76. };
  77. return(nearestpoint);} {}
  78.   }
  79.   Function {draw()} {private
  80.   } {
  81.     code {int ox=x(),oy=y(),lx=w(),ly=h();
  82. if (env->Pfreemode==0) env->converttofree();
  83. int npoints=env->Penvpoints;
  84.  
  85. if (active_r()) fl_color(FL_BLACK);
  86.     else fl_color(90,90,90);
  87. if (!active_r()) currentpoint=-1;
  88.  
  89. fl_rectf(ox,oy,lx,ly);
  90.  
  91. ox+=5;oy+=5;lx-=10;ly-=10;
  92.  
  93. //draw the lines
  94. fl_color(FL_GRAY);
  95.  
  96. fl_line_style(FL_SOLID);
  97. fl_line(ox+2,oy+ly/2,ox+lx-2,oy+ly/2);
  98.  
  99. //draws the evelope points and lines
  100. Fl_Color alb=FL_WHITE;
  101. if (!active_r()) alb=fl_rgb_color(180,180,180);
  102. fl_color(alb);
  103. int oldxx=0,xx=0,oldyy=0,yy=getpointy(0);
  104. fl_rectf(ox-3,oy+yy-3,6,6);
  105. for (int i=1;i<npoints;i++){
  106.     oldxx=xx;oldyy=yy;
  107.     xx=getpointx(i);yy=getpointy(i);
  108.     if (i==currentpoint) fl_color(FL_RED);
  109.         else fl_color(alb);
  110.     fl_line(ox+oldxx,oy+oldyy,ox+xx,oy+yy);
  111.     fl_rectf(ox+xx-3,oy+yy-3,6,6);
  112. };
  113.  
  114. //draw the last moved point point (if exists)
  115. if (lastpoint>=0){
  116.     fl_color(FL_CYAN);
  117.     fl_rectf(ox+getpointx(lastpoint)-5,oy+getpointy(lastpoint)-5,10,10);
  118. };
  119.  
  120. //draw the sustain position
  121. if (env->Penvsustain>0){
  122.     fl_color(FL_YELLOW);
  123.     xx=getpointx(env->Penvsustain);
  124.     fl_line(ox+xx,oy+0,ox+xx,oy+ly);
  125. };
  126.  
  127. //Show the envelope duration and the current line duration
  128. fl_font(FL_HELVETICA|FL_BOLD,10);
  129. float time=0.0;
  130. if (currentpoint<=0){
  131.    fl_color(alb);
  132.    for (int i=1;i<npoints;i++) time+=env->getdt(i);
  133. } else {
  134.    fl_color(255,0,0);
  135.    time=env->getdt(currentpoint);
  136. };
  137. char tmpstr[20];
  138. if (time<1000.0) snprintf((char *)&tmpstr,20,"%.1fms",time);
  139.      else snprintf((char *)&tmpstr,20,"%.2fs",time/1000.0);
  140. fl_draw(tmpstr,ox+lx-20,oy+ly-10,20,10,FL_ALIGN_RIGHT,NULL,0);} {}
  141.   }
  142.   Function {handle(int event)} {return_type int
  143.   } {
  144.     code {int x_=Fl::event_x()-x();
  145. int y_=Fl::event_y()-y();
  146.  
  147. if (event==FL_PUSH) {
  148.   currentpoint=getnearest(x_,y_);
  149.   cpx=x_;
  150.   cpdt=env->Penvdt[currentpoint];
  151.   lastpoint=currentpoint;
  152.   redraw();
  153.   if (pair!=NULL) pair->redraw();
  154. };
  155.  
  156. if (event==FL_RELEASE){
  157.   currentpoint=-1;
  158.   redraw();
  159.   if (pair!=NULL) pair->redraw();
  160. };
  161.  
  162. if ((event==FL_DRAG)&&(currentpoint>=0)){
  163.   int ny=127-(int) (y_*127.0/h());
  164.   if (ny<0) ny=0;if (ny>127) ny=127;
  165.   env->Penvval[currentpoint]=ny;
  166.  
  167.   int dx=(int)((x_-cpx)*0.1);
  168.   int newdt=cpdt+dx;
  169.   if (newdt<0) newdt=0;if (newdt>127) newdt=127;
  170.   if (currentpoint!=0) env->Penvdt[currentpoint]=newdt;
  171.      else env->Penvdt[currentpoint]=0;
  172.  
  173.   redraw();
  174.   if (pair!=NULL) pair->redraw();
  175. };
  176.  
  177.  
  178. return(1);} {}
  179.   }
  180.   decl {Fl_Box *pair;} {}
  181.   decl {EnvelopeParams *env;} {}
  182.   decl {int oldx,oldy;} {}
  183.   decl {int currentpoint,cpx,cpdt;} {}
  184.   decl {int lastpoint;} {public
  185.   }
  186.  
  187. class EnvelopeUI {: {public Fl_Group,PresetsUI_}
  188. } {
  189.   Function {EnvelopeUI(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} {
  190.     code {env=NULL;
  191. freemodeeditwindow=NULL;
  192. envADSR=NULL;
  193. envASR=NULL;
  194. envADSRfilter=NULL;
  195. envASRbw=NULL;
  196. envfree=NULL;} {}
  197.   }
  198.   Function {~EnvelopeUI()} {} {
  199.     code {envwindow->hide();
  200. hide();
  201. freemodeeditwindow->hide();
  202. delete (freemodeeditwindow);} {}
  203.   }
  204.   Function {make_freemode_edit_window()} {} {
  205.     Fl_Window freemodeeditwindow {
  206.       label Envelope
  207.       xywh {60 308 575 180} type Double hide
  208.     } {
  209.       Fl_Box freeedit {
  210.         label Envelope
  211.         xywh {5 5 565 145} box FLAT_BOX color 0
  212.         code0 {o->init(env);}
  213.         class EnvelopeFreeEdit
  214.       }
  215.       Fl_Button addpoint {
  216.         label {Add point}
  217.         callback {int curpoint=freeedit->lastpoint;
  218. if (curpoint<0) return;
  219. //if (curpoint>=env->Penvpoints-1) return;
  220. if (env->Penvpoints>=MAX_ENVELOPE_POINTS) return;
  221.  
  222. for (int i=env->Penvpoints;i>=curpoint+1;i--){
  223.    env->Penvdt[i]=env->Penvdt[i-1];
  224.    env->Penvval[i]=env->Penvval[i-1];
  225. };
  226.  
  227. if (curpoint==0) {
  228.   env->Penvdt[1]=64;
  229. };
  230.  
  231. env->Penvpoints++;
  232. if (curpoint<=env->Penvsustain) env->Penvsustain++;
  233.  
  234. freeedit->lastpoint+=1;
  235. freeedit->redraw();
  236. envfree->redraw();
  237.  
  238. sustaincounter->value(env->Penvsustain);
  239. sustaincounter->maximum(env->Penvpoints-2);}
  240.         xywh {115 155 80 20} box THIN_UP_BOX
  241.         code0 {if (env->Pfreemode==0) o->hide();}
  242.       }
  243.       Fl_Button deletepoint {
  244.         label {Delete point}
  245.         callback {int curpoint=freeedit->lastpoint;
  246. if (curpoint<1) return;
  247. if (curpoint>=env->Penvpoints-1) return;
  248. if (env->Penvpoints<=3) return;
  249.  
  250. for (int i=curpoint+1;i<env->Penvpoints;i++){
  251.    env->Penvdt[i-1]=env->Penvdt[i];
  252.    env->Penvval[i-1]=env->Penvval[i];
  253. };
  254.  
  255. env->Penvpoints--;
  256.  
  257. if (curpoint<=env->Penvsustain) env->Penvsustain--;
  258.  
  259.  
  260. freeedit->lastpoint-=1;
  261. freeedit->redraw();
  262. envfree->redraw();
  263.  
  264. sustaincounter->value(env->Penvsustain);
  265. sustaincounter->maximum(env->Penvpoints-2);}
  266.         xywh {200 155 80 20} box THIN_UP_BOX
  267.         code0 {if (env->Pfreemode==0) o->hide();}
  268.       }
  269.       Fl_Light_Button freemodebutton {
  270.         label FreeMode
  271.         callback {reinit();
  272.  
  273. freeedit->lastpoint=-1;
  274. freeedit->redraw();}
  275.         tooltip {Enable or disable the freemode} xywh {10 155 95 25} box PLASTIC_UP_BOX
  276.       }
  277.       Fl_Check_Button forcedreleasecheck {
  278.         label frcR
  279.         callback {env->Pforcedrelease=(int)o->value();}
  280.         tooltip {Forced Relase} xywh {410 165 40 15} down_box DOWN_BOX labelsize 11
  281.         code0 {o->value(env->Pforcedrelease);}
  282.         code1 {if (env->Pfreemode==0) o->hide();}
  283.       }
  284.       Fl_Dial envstretchdial {
  285.         label {Str.}
  286.         callback {env->Penvstretch=(int)o->value();}
  287.         tooltip {Envelope stretch (on lower notes make the envelope longer)} xywh {380 155 25 25} box ROUND_UP_BOX labelsize 11 align 4 maximum 127 step 1
  288.         code0 {o->value(env->Penvstretch);}
  289.         code1 {if (env->Pfreemode==0) o->hide();}
  290.         class WidgetPDial
  291.       }
  292.       Fl_Button {} {
  293.         label Close
  294.         callback {freemodeeditwindow->hide();}
  295.         xywh {510 155 60 25} box THIN_UP_BOX
  296.       }
  297.       Fl_Check_Button linearenvelopecheck {
  298.         label L
  299.         callback {env->Plinearenvelope=(int)o->value();}
  300.         tooltip {Linear Envelope} xywh {410 151 30 15} down_box DOWN_BOX labelsize 11
  301.         code0 {o->value(env->Plinearenvelope);}
  302.         code1 {if ((env->Pfreemode==0)||(env->Envmode>2)) o->hide();}
  303.       }
  304.       Fl_Counter sustaincounter {
  305.         label Sust
  306.         callback {env->Penvsustain=(int) o->value();
  307. freeedit->redraw();
  308. envfree->redraw();}
  309.         tooltip {Sustain (0 is disabled)} xywh {315 155 40 15} type Simple labelsize 12 align 4 minimum 0 maximum 127 step 1
  310.         code0 {o->value(env->Penvsustain);}
  311.         code1 {if (env->Pfreemode==0) o->hide();}
  312.         code2 {o->maximum(env->Penvpoints-2);}
  313.       }
  314.       Fl_Button {} {
  315.         label C
  316.         callback {presetsui->copy(env);}
  317.         xywh {465 160 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  318.       }
  319.       Fl_Button {} {
  320.         label P
  321.         callback {presetsui->paste(env,this);}
  322.         xywh {482 160 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  323.       }
  324.     }
  325.   }
  326.   Function {make_ADSR_window()} {} {
  327.     Fl_Window envADSR {
  328.       xywh {108 336 205 70} type Double color 50 labelfont 1 hide
  329.       class Fl_Group
  330.     } {
  331.       Fl_Group {} {
  332.         label {Amplitude Envelope}
  333.         xywh {0 0 205 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17
  334.       } {
  335.         Fl_Dial e1adt {
  336.           label {A.dt}
  337.           callback {env->PA_dt=(int)o->value();
  338. freeedit->redraw();}
  339.           tooltip {Attack time} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  340.           code0 {o->value(env->PA_dt);}
  341.           class WidgetPDial
  342.         }
  343.         Fl_Dial e1ddt {
  344.           label {D.dt}
  345.           callback {env->PD_dt=(int)o->value();
  346. freeedit->redraw();}
  347.           tooltip {Decay time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  348.           code0 {o->value(env->PD_dt);}
  349.           class WidgetPDial
  350.         }
  351.         Fl_Dial e1rdt {
  352.           label {R.dt}
  353.           callback {env->PR_dt=(int)o->value();
  354. freeedit->redraw();}
  355.           tooltip {Release time} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  356.           code0 {o->value(env->PR_dt);}
  357.           class WidgetPDial
  358.         }
  359.         Fl_Dial e1sval {
  360.           label {S.val}
  361.           callback {env->PS_val=(int)o->value();
  362. freeedit->redraw();}
  363.           tooltip {Sustain value} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  364.           code0 {o->value(env->PS_val);}
  365.           class WidgetPDial
  366.         }
  367.         Fl_Check_Button e1forcedrelease {
  368.           label frcR
  369.           callback {env->Pforcedrelease=(int)o->value();}
  370.           tooltip {Forced Relase} xywh {180 35 20 15} down_box DOWN_BOX labelsize 11 align 6
  371.           code0 {o->value(env->Pforcedrelease);}
  372.         }
  373.         Fl_Dial e1envstretch {
  374.           label Stretch
  375.           callback {env->Penvstretch=(int)o->value();}
  376.           tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {145 25 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  377.           code0 {o->value(env->Penvstretch);}
  378.           class WidgetPDial
  379.         }
  380.         Fl_Button {} {
  381.           label E
  382.           callback {freemodeeditwindow->show();}
  383.           tooltip {Envelope window} xywh {185 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  384.         }
  385.         Fl_Check_Button e1linearenvelope {
  386.           label L
  387.           callback {env->Plinearenvelope=(int)o->value();}
  388.           tooltip {The evelope is linear} xywh {180 20 15 15} down_box DOWN_BOX labelsize 11 align 4
  389.           code0 {o->value(env->Plinearenvelope);}
  390.         }
  391.         Fl_Button {} {
  392.           label C
  393.           callback {presetsui->copy(env);}
  394.           xywh {150 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  395.         }
  396.         Fl_Button {} {
  397.           label P
  398.           callback {presetsui->paste(env,this);}
  399.           xywh {167 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  400.         }
  401.       }
  402.     }
  403.   }
  404.   Function {make_ASR_window()} {} {
  405.     Fl_Window envASR {
  406.       xywh {71 320 210 70} type Double hide
  407.       class Fl_Group
  408.     } {
  409.       Fl_Group {} {
  410.         label {Frequency Envelope}
  411.         xywh {0 0 210 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17
  412.       } {
  413.         Fl_Dial e2aval {
  414.           label {A.val}
  415.           callback {env->PA_val=(int)o->value();
  416. freeedit->redraw();}
  417.           tooltip {Starting value} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  418.           code0 {o->value(env->PA_val);}
  419.           class WidgetPDial
  420.         }
  421.         Fl_Dial e2adt {
  422.           label {A.dt}
  423.           callback {env->PA_dt=(int)o->value();
  424. freeedit->redraw();}
  425.           tooltip {Attack time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  426.           code0 {o->value(env->PA_dt);}
  427.           class WidgetPDial
  428.         }
  429.         Fl_Dial e2rval {
  430.           label {R.val}
  431.           callback {env->PR_val=(int)o->value();
  432. freeedit->redraw();}
  433.           tooltip {Release value} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  434.           code0 {o->value(env->PR_val);}
  435.           class WidgetPDial
  436.         }
  437.         Fl_Dial e2rdt {
  438.           label {R.dt}
  439.           callback {env->PR_dt=(int)o->value();
  440. freeedit->redraw();}
  441.           tooltip {Release time} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  442.           code0 {o->value(env->PR_dt);}
  443.           class WidgetPDial
  444.         }
  445.         Fl_Dial e2envstretch {
  446.           label Stretch
  447.           callback {env->Penvstretch=(int)o->value();}
  448.           tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {145 25 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  449.           code0 {o->value(env->Penvstretch);}
  450.           class WidgetPDial
  451.         }
  452.         Fl_Check_Button e2forcedrelease {
  453.           label frcR
  454.           callback {env->Pforcedrelease=(int)o->value();}
  455.           tooltip {Forced release} xywh {180 25 15 25} down_box DOWN_BOX labelsize 11 align 6
  456.           code0 {o->value(env->Pforcedrelease);}
  457.         }
  458.         Fl_Button {} {
  459.           label C
  460.           callback {presetsui->copy(env);}
  461.           xywh {155 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  462.         }
  463.         Fl_Button {} {
  464.           label P
  465.           callback {presetsui->paste(env,this);}
  466.           xywh {172 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  467.         }
  468.       }
  469.       Fl_Button {} {
  470.         label E
  471.         callback {freemodeeditwindow->show();}
  472.         tooltip {Envelope window} xywh {190 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  473.       }
  474.     }
  475.   }
  476.   Function {make_ADSRfilter_window()} {} {
  477.     Fl_Window envADSRfilter {
  478.       xywh {87 143 275 70} type Double color 50 labelfont 1 hide
  479.       class Fl_Group
  480.     } {
  481.       Fl_Group {} {
  482.         label {Filter Envelope}
  483.         xywh {0 0 275 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17
  484.       } {
  485.         Fl_Dial e3aval {
  486.           label {A.val}
  487.           callback {env->PA_val=(int)o->value();
  488. freeedit->redraw();}
  489.           tooltip {Starting value} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  490.           code0 {o->value(env->PA_val);}
  491.           class WidgetPDial
  492.         }
  493.         Fl_Dial e3adt {
  494.           label {A.dt}
  495.           callback {env->PA_dt=(int)o->value();
  496. freeedit->redraw();}
  497.           tooltip {Attack time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  498.           code0 {o->value(env->PA_dt);}
  499.           class WidgetPDial
  500.         }
  501.         Fl_Dial e3dval {
  502.           label {D.val}
  503.           callback {env->PD_val=(int)o->value();
  504. freeedit->redraw();}
  505.           tooltip {decay value} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  506.           code0 {o->value(env->PD_val);}
  507.           class WidgetPDial
  508.         }
  509.         Fl_Dial e3ddt {
  510.           label {D.dt}
  511.           callback {env->PD_dt=(int)o->value();
  512. freeedit->redraw();}
  513.           tooltip {decay time} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  514.           code0 {o->value(env->PD_dt);}
  515.           class WidgetPDial
  516.         }
  517.         Fl_Dial e3rdt {
  518.           label {R.dt}
  519.           callback {env->PR_dt=(int)o->value();
  520. freeedit->redraw();}
  521.           tooltip {Release time} xywh {145 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  522.           code0 {o->value(env->PR_dt);}
  523.           class WidgetPDial
  524.         }
  525.         Fl_Dial e3rval {
  526.           label {R.val}
  527.           callback {env->PR_val=(int)o->value();
  528. freeedit->redraw();}
  529.           tooltip {Release value} xywh {180 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  530.           code0 {o->value(env->PR_val);}
  531.           class WidgetPDial
  532.         }
  533.         Fl_Dial e3envstretch {
  534.           label Stretch
  535.           callback {env->Penvstretch=(int)o->value();}
  536.           tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {215 25 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  537.           code0 {o->value(env->Penvstretch);}
  538.           class WidgetPDial
  539.         }
  540.         Fl_Check_Button e3forcedrelease {
  541.           label frcR
  542.           callback {env->Pforcedrelease=(int)o->value();}
  543.           tooltip {Forced Relase} xywh {250 30 15 20} down_box DOWN_BOX labelsize 11 align 6
  544.           code0 {o->value(env->Pforcedrelease);}
  545.         }
  546.         Fl_Button {} {
  547.           label E
  548.           callback {freemodeeditwindow->show();}
  549.           xywh {255 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  550.         }
  551.         Fl_Button {} {
  552.           label C
  553.           callback {presetsui->copy(env);}
  554.           xywh {220 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  555.         }
  556.         Fl_Button {} {
  557.           label P
  558.           callback {presetsui->paste(env,this);}
  559.           xywh {237 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  560.         }
  561.       }
  562.     }
  563.   }
  564.   Function {make_ASRbw_window()} {} {
  565.     Fl_Window envASRbw {
  566.       xywh {224 539 210 70} type Double hide
  567.       class Fl_Group
  568.     } {
  569.       Fl_Group {} {
  570.         label {BandWidth Envelope}
  571.         xywh {0 0 210 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17
  572.       } {
  573.         Fl_Dial e4aval {
  574.           label {A.val}
  575.           callback {env->PA_val=(int)o->value();
  576. freeedit->redraw();}
  577.           tooltip {Starting value} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  578.           code0 {o->value(env->PA_val);}
  579.           class WidgetPDial
  580.         }
  581.         Fl_Dial e4adt {
  582.           label {A.dt}
  583.           callback {env->PA_dt=(int)o->value();
  584. freeedit->redraw();}
  585.           tooltip {Attack time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  586.           code0 {o->value(env->PA_dt);}
  587.           class WidgetPDial
  588.         }
  589.         Fl_Dial e4rval {
  590.           label {R.val}
  591.           callback {env->PR_val=(int)o->value();
  592. freeedit->redraw();}
  593.           tooltip {Release value} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  594.           code0 {o->value(env->PR_val);}
  595.           class WidgetPDial
  596.         }
  597.         Fl_Dial e4rdt {
  598.           label {R.dt}
  599.           callback {env->PR_dt=(int)o->value();
  600. freeedit->redraw();}
  601.           tooltip {Release time} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  602.           code0 {o->value(env->PR_dt);}
  603.           class WidgetPDial
  604.         }
  605.         Fl_Dial e4envstretch {
  606.           label Stretch
  607.           callback {env->Penvstretch=(int)o->value();}
  608.           tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {145 25 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  609.           code0 {o->value(env->Penvstretch);}
  610.           class WidgetPDial
  611.         }
  612.         Fl_Check_Button e4forcedrelease {
  613.           label frcR
  614.           callback {env->Pforcedrelease=(int)o->value();}
  615.           tooltip {Forced release} xywh {180 25 15 25} down_box DOWN_BOX labelsize 11 align 6
  616.           code0 {o->value(env->Pforcedrelease);}
  617.         }
  618.         Fl_Button {} {
  619.           label C
  620.           callback {presetsui->copy(env);}
  621.           xywh {155 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  622.         }
  623.         Fl_Button {} {
  624.           label P
  625.           callback {presetsui->paste(env,this);}
  626.           xywh {172 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  627.         }
  628.       }
  629.       Fl_Button {} {
  630.         label E
  631.         callback {freemodeeditwindow->show();}
  632.         xywh {190 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  633.       }
  634.     }
  635.   }
  636.   Function {make_free_window()} {} {
  637.     Fl_Window envfree {
  638.       xywh {373 413 205 70} type Double color 50 labelfont 1 hide resizable
  639.       class Fl_Group
  640.     } {
  641.       Fl_Group envfreegroup {
  642.         label {Amplitude Envelope}
  643.         xywh {0 0 205 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17 resizable
  644.       } {
  645.         Fl_Box freeeditsmall {
  646.           label Envelope
  647.           callback {envfree->redraw();}
  648.           xywh {5 20 195 45} box FLAT_BOX color 0 resizable
  649.           code0 {o->init(env);}
  650.           class EnvelopeFreeEdit
  651.         }
  652.         Fl_Button {} {
  653.           label E
  654.           callback {freemodeeditwindow->show();}
  655.           xywh {185 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  656.         }
  657.         Fl_Button {} {
  658.           label C
  659.           callback {presetsui->copy(env);}
  660.           xywh {150 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  661.         }
  662.         Fl_Button {} {
  663.           label P
  664.           callback {presetsui->paste(env,this);}
  665.           xywh {167 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  666.         }
  667.       }
  668.     }
  669.   }
  670.   Function {init(EnvelopeParams *env_)} {} {
  671.     code {env=env_;
  672. make_ADSR_window();
  673. make_ASR_window();
  674. make_ADSRfilter_window();
  675. make_ASRbw_window();
  676. make_free_window();
  677.  
  678. make_freemode_edit_window();
  679.  
  680. envwindow=NULL;
  681. if (env->Envmode==3) envfreegroup->label("Frequency Envelope");
  682. if (env->Envmode==4) envfreegroup->label("Filter Envelope");
  683. if (env->Envmode==5) envfreegroup->label("Bandwidth Envelope");
  684.  
  685. freemodeeditwindow->label(this->label());
  686.  
  687.  
  688. freeeditsmall->setpair(freeedit);
  689. freeedit->setpair(freeeditsmall);
  690.  
  691.  
  692. refresh();} {}
  693.   }
  694.   Function {reinit()} {} {
  695.     code {if (env->Pfreemode!=0){
  696.   int answer=fl_ask("Disable the free mode of the Envelope?");
  697.   if (env->Pfreemode!=0) freemodebutton->value(1);
  698.           else freemodebutton->value(0);
  699.   if (answer==0) return;
  700. };
  701.  
  702. if (env->Pfreemode==0) env->Pfreemode=1;
  703.      else env->Pfreemode=0;
  704.  
  705. hide();
  706. int winx=freemodeeditwindow->x();
  707. int winy=freemodeeditwindow->y();
  708.  
  709. freemodeeditwindow->hide();
  710.  
  711. envwindow->hide();
  712. Fl_Group *par=envwindow->parent();
  713. par->hide();
  714.  
  715.  
  716. refresh();
  717. envwindow->show();
  718. par->redraw();
  719.  
  720. par->show();
  721. show();
  722. freemodeeditwindow->position(winx,winy);
  723. freemodeeditwindow->show();
  724.  
  725. if (env->Pfreemode!=0) {
  726.     freemodebutton->value(1);
  727.     addpoint->show();
  728.     deletepoint->show();
  729.     forcedreleasecheck->show();
  730. }else{
  731.     freemodebutton->value(0);
  732.     addpoint->hide();
  733.     deletepoint->hide();
  734.     forcedreleasecheck->hide();
  735. };} {selected
  736.     }
  737.   }
  738.   Function {refresh()} {} {
  739.     code {freemodebutton->value(env->Pfreemode);
  740.  
  741. sustaincounter->value(env->Penvsustain);
  742. if (env->Pfreemode==0) sustaincounter->hide();
  743.     else sustaincounter->show();
  744. sustaincounter->maximum(env->Penvpoints-2);
  745.  
  746. envstretchdial->value(env->Penvstretch);
  747. if (env->Pfreemode==0) envstretchdial->hide();
  748.     else envstretchdial->show();
  749.  
  750. linearenvelopecheck->value(env->Plinearenvelope);
  751. if ((env->Pfreemode==0)||(env->Envmode>2)) linearenvelopecheck->hide();
  752.     else linearenvelopecheck->show();
  753.  
  754. forcedreleasecheck->value(env->Pforcedrelease);
  755. if (env->Pfreemode==0) forcedreleasecheck->hide();
  756.  
  757. freeedit->redraw();
  758.  
  759.  
  760. if (env->Pfreemode==0){
  761.    switch(env->Envmode){
  762.          case(1):
  763.          case(2):
  764.         e1adt->value(env->PA_dt);
  765.         e1ddt->value(env->PD_dt);
  766.         e1sval->value(env->PS_val);
  767.         e1rdt->value(env->PR_dt);
  768.         e1envstretch->value(env->Penvstretch);
  769.         e1linearenvelope->value(env->Plinearenvelope);
  770.         e1forcedrelease->value(env->Pforcedrelease);
  771.          break;
  772.          case(3):
  773.         e2aval->value(env->PA_val);
  774.         e2adt->value(env->PA_dt);
  775.         e2rdt->value(env->PR_dt);
  776.         e2rval->value(env->PR_val);
  777.         e2envstretch->value(env->Penvstretch);
  778.         e2forcedrelease->value(env->Pforcedrelease);
  779.          break; 
  780.          case(4):
  781.         e3aval->value(env->PA_val);
  782.         e3adt->value(env->PA_dt);
  783.         e3dval->value(env->PD_val);
  784.         e3ddt->value(env->PD_dt);
  785.         e3rdt->value(env->PR_dt);
  786.         e3rval->value(env->PR_val);
  787.         e3envstretch->value(env->Penvstretch);
  788.         e3forcedrelease->value(env->Pforcedrelease);
  789.          break; 
  790.          case(5):
  791.         e4aval->value(env->PA_val);
  792.         e4adt->value(env->PA_dt);
  793.         e4rdt->value(env->PR_dt);
  794.         e4rval->value(env->PR_val);
  795.         e4envstretch->value(env->Penvstretch);
  796.         e4forcedrelease->value(env->Pforcedrelease);
  797.          break;
  798.          default:
  799.          break; 
  800.    };
  801. }else{
  802.        envfree->redraw();
  803. };
  804.  
  805.  
  806. envADSR->hide();
  807. envASR->hide();
  808. envADSRfilter->hide();
  809. envASRbw->hide();
  810. envfree->hide();
  811.  
  812. if (env->Pfreemode==0){
  813.    switch(env->Envmode){
  814.          case(1):
  815.          case(2):
  816.            envwindow=envADSR;
  817.          break;
  818.          case(3):
  819.            envwindow=envASR;
  820.          break; 
  821.          case(4):
  822.            envwindow=envADSRfilter;
  823.          break; 
  824.          case(5):
  825.           envwindow=envASRbw;
  826.          break;
  827.          default:
  828.          break; 
  829.    };
  830. }else{
  831.    envwindow=envfree;
  832. };
  833.  
  834. envwindow->resize(this->x(),this->y(),this->w(),this->h());
  835.  
  836. envwindow->show();} {}
  837.   }
  838.   decl {EnvelopeParams *env;} {}
  839.   decl {Fl_Group *envwindow;} {}
  840.